home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
m2
/
cat3src
/
magic
/
d
/
mtutils.d
< prev
next >
Wrap
Text File
|
1997-10-26
|
12KB
|
294 lines
(*----------------------------------------------------------------------*
* *
* MAGICTOOLS Modula's All purpose GEM Interface Cadre Toolbox *
* ÿ ÿ ÿ ÿ ÿ *
*----------------------------------------------------------------------*
* Version 3.30 02.02.1992 (C)90/91/92 by Peter Hellinger Software *
*----------------------------------------------------------------------*
* Dieses Modul ist urheberrechtlich geschtzt. *
* *
* Die Verffentlichung des Quelltextes oder Teilen daraus, sowie die *
* Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
* oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail- *
* boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen *
* Einverstndnisserklrung des Autors. *
* *
* Die Verbreitung des Moduls als Teil eines gelinkten Programms ist *
* fr Lizenznehmer ausdrcklich erlaubt! Der Autor behlt sich das *
* Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
* widerrufen. *
*----------------------------------------------------------------------*)
(*----------------------------------------------------------------------*
* mtUtils Dies und Das, fr jeden was... *
*----------------------------------------------------------------------*)
DEFINITION MODULE mtUtils;
FROM MagicSys IMPORT Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET;
IMPORT SYSTEM;
FROM MagicAES IMPORT OBJECT;
TYPE AnyType = RECORD
CASE x: sCARDINAL OF
0: int: lINTEGER;|
1: card: lCARDINAL;|
2: hint: sINTEGER; lint: sINTEGER;|
3: hcard: sCARDINAL; lcard: sCARDINAL;|
4: b4: Byte; b3: Byte; b2: Byte; b1: Byte;|
END;
END;
(* Der alte "CASE-Trick": Damit konnen sehr einfach bestimmte Teile
* eines Wertes isoliert werden.
*)
TYPE tRect = RECORD
x: sINTEGER;
y: sINTEGER;
w: sINTEGER;
h: sINTEGER;
END;
(* Rechteckflche. Wird z.b. bei allen Magic-Modulen benutzt, die mit
* den Dials oder den Popupmens zu tun haben.
*)
TYPE tObjcTree = POINTER TO ARRAY [0..MAX(sINTEGER)] OF OBJECT;
(* Wird beim direkten manipulieren des Objektbaumes verwendet.
* Beispiel:
*
* VAR tree:= tObjcTree;
*
* IF SELECTED IN tree^[object].obState THEN ...
*)
(* Modifizieren der obState und obFlags *)
PROCEDURE InclFlag (tree: SYSTEM.ADDRESS; entry, bit: sINTEGER);
(* Setzt bit in tree^[entry].obFlags *)
PROCEDURE ExclFlag (tree: SYSTEM.ADDRESS; entry, bit: sINTEGER);
(* Lscht bit in tree^[entry].obFlags *)
PROCEDURE SetFlag (tree: SYSTEM.ADDRESS; entry, bit: sINTEGER; set: BOOLEAN);
(* Setzt bzw. lscht bit in tree^[entry].obFlags, in Abhngigkeit
* von set: Bei TRUE wird gesetzt, sonst gelscht
*)
PROCEDURE InFlag (tree: SYSTEM.ADDRESS; entry, bit: sINTEGER): BOOLEAN;
(* TRUE, wenn bit in tree^[entry].obFlags *)
PROCEDURE InclState (tree: SYSTEM.ADDRESS; entry, bit: sINTEGER);
(* Setzt bit in tree^[entry].obState *)
PROCEDURE ExclState (tree: SYSTEM.ADDRESS; entry, bit: sINTEGER);
(* Lscht bit in tree^[entry].obState *)
PROCEDURE InState (tree: SYSTEM.ADDRESS; entry, bit: sINTEGER): BOOLEAN;
(* TRUE, wenn bit in tree^[entry].obState *)
PROCEDURE SetState (tree: SYSTEM.ADDRESS; entry, bit: sINTEGER; set: BOOLEAN);
(* Setzt bzw. lscht bit in tree^[entry].obState, in Abhngigkeit
* von set: Bei TRUE wird gesetzt, sonst gelscht
*)
(* Hilfsfunktionen fr Three-State-Buttons *)
CONST NOCHANGE = 0; (* gepunktet *)
CLEAR = 1; (* gelscht *)
SETNEW = 2; (* angekreuzt *)
PROCEDURE GetThreeState (tree: SYSTEM.ADDRESS; entry : sINTEGER): sINTEGER;
(* Holt Status eines 3-State-Buttons *)
PROCEDURE SetThreeState (tree: SYSTEM.ADDRESS; entry, val : sINTEGER);
(* Setzt Status eines 3-State-Buttons *)
(* Manipulieren von String-Objekten *)
PROCEDURE ObjcString (tree: SYSTEM.ADDRESS; entry: sINTEGER; VAR str: ARRAY OF CHAR);
(* Liefert den String der folgenden Objekte:
* GBOXCHAR, GTEXT, GBOXTEXT, GFTEXT, GFBOXTEXT, GBUTTON,
* GSTRING, GTITLE
*)
PROCEDURE ObjcStringAdr (tree: SYSTEM.ADDRESS; entry: sINTEGER): SYSTEM.ADDRESS;
(* Liefert einen Zeiger auf den String des Objekts *)
PROCEDURE SetObjcString (tree: SYSTEM.ADDRESS; entry: sINTEGER; REF str: ARRAY OF CHAR);
(* Setzt den String der folgenden Objekte indem str direkt in die Resource
* kopiert wird: GBOXCHAR, GTEXT, GBOXTEXT, GFTEXT, GFBOXTEXT, GBUTTON,
* GSTRING, GTITLE
*
* Ist der String krzer als die maximale Lnge wird mit Blanks bis zur
* maximalen Lnge aufgefllt. Dies gilt nicht fr TEDINFO-Objekte!
*)
PROCEDURE SetObjcStringAdr (tree: SYSTEM.ADDRESS; entry: sINTEGER; str: SYSTEM.ADDRESS);
(* Setzt den String der folgenden Objekte durch Austausch des entspr.
* Zeigers: GBOXCHAR, GTEXT, GBOXTEXT, GFTEXT, GFBOXTEXT, GBUTTON,
* GSTRING, GTITLE
*)
PROCEDURE ObjcStrLen (tree: SYSTEM.ADDRESS; entry: sINTEGER;
VAR textLen, tmpltLen: sINTEGER);
(* Liefert die Lnge eine String-Objekts, bei TEDINFO-Objekten auch die
* Lnge des Templates; sonst ist tmpltLen -1. Idee: Dirk Steins
*)
(* Objektpositionen, Flchen, Rahmen etc.
*
* SEHR WICHTIG!!!
* ---------------
* ALLE Rechtecke sind jeweils Koordinate (x,y) sowie Breite und Hhe!!!
*)
PROCEDURE ObjcPos (tree: SYSTEM.ADDRESS; entry: sINTEGER; VAR x, y: sINTEGER);
(* berechnet die Position eines Objekts. Ist zwar das gleiche wie
* ObjcOffset, aber wesentlich schneller, da es direkt im Objektbaum
* operiert, und nicht erst ber einen Trap2 gehen mu.
*)
PROCEDURE ObjcParent (objc: SYSTEM.ADDRESS; entry: sINTEGER): sINTEGER;
(* Liefert das Parent-Objekt zu entry *)
PROCEDURE ObjcRect (tree: SYSTEM.ADDRESS; entry: sINTEGER; VAR rect: ARRAY OF LOC);
(* Liefert Objektkoordinaten des Objektes relativ zum Parent-Objekt.
* Idee: Dirk Steins
*)
PROCEDURE SetObjcRect (tree: SYSTEM.ADDRESS; entry: sINTEGER; rect: ARRAY OF LOC);
(* Setzt Koordinaten (obX, obY, obWidth und obHeight des Objekts auf
* die in rect bergebenen Werte. (Relativ zum Parent-Objekt)
* Idee: Dirk Steins
*)
PROCEDURE ObjcArea (tree: SYSTEM.ADDRESS; entry: sINTEGER; VAR rect: ARRAY OF LOC);
(* Liefert Objektkoordinaten des Objekts relativ zum Bildschirm Ursprung *)
PROCEDURE ObjcFrame (tree: SYSTEM.ADDRESS; obj: sINTEGER): sINTEGER;
(* Liefert die Rahmendicke eines Objekts. Dabei werden Stati wie OUTLINED und
* Shadowed bercksichtigt. Ist das Ergebnis kleiner als 0, liegt der Rahmen
* AUSSERHALB des Objekts, ansonsten INNERHALB!
*)
PROCEDURE CalcArea (tree: SYSTEM.ADDRESS; entry: sINTEGER; VAR rect: ARRAY OF LOC);
(* Berechnet Umgebungsrechteck des Objektes. Die Objektstati werden
* dabei bercksichtigt.
*)
CONST SearchType = 0;
SearchState = 1;
SearchFlags = 2;
PROCEDURE ScanFlags (tree: SYSTEM.ADDRESS; set, entry, flag: sINTEGER): sINTEGER;
(* Sucht einen bestimmtes Flag im Objektbaum, abhngig von set.
* Wenn set = SearchType wird ein obType gesucht, bei set = SearchState wird
* ein Flag im obState gesucht, bei set = SearchFlags in obFlags
*)
PROCEDURE ScanMenu (tree: SYSTEM.ADDRESS; scan: sINTEGER;
kbshift: sBITSET; VAR title, item: INTEGER): BOOLEAN;
(* Scannt einen Menbaum nach bestimmten Eintrgen. So kann z.B. der User
* die Tastenbelegungen ndern, ohne das das Programm gendert werden mu...
* Die Tasteneintrge mssen allerdings in einer besonderen Form vorliegen!
* Es knnen normale Tasten, Tasten mit Control und Tasten mit Alternate
* vorkommen. Ein normaler Tastencode mu - wie beim STE/TT-Desktop - in
* eckige Klammern eingefat sein. Fr Control wird das Zeichen ^ verwendet,
* fr Alternate das Zeichen, welches im Fuller-Feld eines Fensters steht.
* Beispiel:
*
* Eintrag Normal [M]
* Eintrag Control ^M
* Eintrag Alternate #M
*
* Die Routine liefert TRUE, wenn ein Eintrag gefunden wurde.
*
* tree = Adresse des Menbaums
* first = Erster Eintrag ab dem gesucht werden soll
* last = Letzter Eintrag in dem gesucht werden soll
* scan = Scancode der gedrckten Taste
* kbshift = Status der Sondertasten
* titel = der gefundene Mentitel oder -1
* item = der gefundene Meneintrag oder -1
*)
(* Vermischtes *)
PROCEDURE CharCode (scan: sINTEGER; kbshift: sBITSET): CHAR;
(* Liest die Tastaturtabelle aus und liefert anhand Scancode und Sonder-
* tastenstatus den ASCII-Code.
*)
PROCEDURE ScanCode (ch: CHAR): sINTEGER;
(* Umkehrfunktion zu CharCode. Sucht anhand eines Chars nach dem Scancode,
* 0 wenn nicht gefunden. Achtung: Es existieren nicht zu allen Zeichen
* Scancodes, sondern nur fr jede Taste!!!
*)
PROCEDURE DoubleClick (VAR value: sINTEGER): BOOLEAN;
(* Maskiert Bit15 aus value aus; liefert TRUE, wenn es gesetzt war.
* Sinn der bung: DialDo bzw. FormDo liefern bei einem Doppelklick
* das angeklickte Objekt mit gesetzem Bit15.
*)
PROCEDURE Bounce;
(* "Entprellt" die Maustaste. d.h. wartet, bis keine Maustaste mehr
* gedrckt wird.
*)
PROCEDURE Min (i1, i2: sINTEGER): sINTEGER;
(* Liefert den kleineren der beiden Werte *)
PROCEDURE Max (i1, i2: sINTEGER): sINTEGER;
(* Liefert den greren der beiden Werte *)
(* Bei Magic sind alle Rechtecke blicherweise RELATIVE Koordinaten, will
* sagen, sie bestehen aus Koordinate (x, y) sowie BREITE und HHE. Dies
* entspricht den Rechtecken, wie sie das AES erwartet.
* Leider gilt dies nicht fr VDI-Rechtecke. Das VDI erwartet Rechtecke
* in ABSOLUTEN KOORDINATEN, also Koordinate "Links oben" und Koordinate
* (Rechts unten).
*
* Die folgende Porzeduren dienen zum Manipulieren von Reckteck-
* KOORDINATEN.
*)
PROCEDURE AbsRect (VAR rect: ARRAY OF LOC);
(* Diese Prozedur wandelt ein relatives Rechteck in ein absolutes *)
PROCEDURE RelRect (VAR rect: ARRAY OF LOC);
(* Diese Prozedur wandelt ein absolutes Rechteck in ein relatives *)
PROCEDURE RectToVars (rect: ARRAY OF LOC; abs: BOOLEAN;
VAR x, y, w, h: sINTEGER);
(* Macht aus einem Rechteck vier einzelne Variable. Bei abs = TRUE werden
* absolute Werte geliefert (w:= x + w;). Geht davon aus, da die Daten
* in rect ein Rechteckt mit Koordinate und Breite/Hhe darstellen -
* entsprechend dem Typ tRect;
*)
PROCEDURE VarsToRect (x, y, w, h: sINTEGER; abs: BOOLEAN;
VAR rect: ARRAY OF LOC);
(* Umkehrfunktion zu RectToVars *)
PROCEDURE AbsRectToVars (rect: ARRAY OF LOC; abs: BOOLEAN;
VAR x, y, w, h: sINTEGER);
(* Wie RectToVars, geht aber von absoluten Koordinaten in rect aus *)
PROCEDURE AbsVarsToRect (x, y, w, h: sINTEGER; abs: BOOLEAN;
VAR rect: ARRAY OF LOC);
(* Umkehrfunktion zu AbsRectToVars *)
END mtUtils.